//
//  OperationTableViewController.h
//  OperationQueueDemo
//
//  Created by 苏沫离 on 2018/8/9.
//  Copyright © 2018年 苏沫离. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface OperationTableViewController : UITableViewController

NSOperation;
@end

/*
 NSOperation 的生命周期 
 ready ->  executing ->  finished
 
 cancelled
 


 可以把 NSOperation 理解为 GCD 中的 任务块 dispath_block_t 或者任务函数
 



 
 
 NSOperation是一锤子买卖, 也就是说NSOperation在状态变化以后, 不能返回到原来的状态.
 
 
 1、执行操作
 ```-(void)start```|开始执行操作
 ```-(void)main```|执行的非并发任务
 completionBlock 当属性```finished```的值更改为YES时，将执行该代码块。该代码块通常是一个子线程执行；因此，不应该使用这个块来做刷新UI。一个完成的操作可能因为它被取消或者因为它成功地完成了它的任务而结束；在编写代码块时，应该考虑到这一点。
 
 
 2、取消操作
 ```-(void)cancel```|通知操作对象应该停止执行其任务。该方法不会将操作强制停止；它更新```NSOperation```的内部```cancelled```以反映状态的变化。如果操作已经完成执行，调用该方法无实际意义；可以调用该方法取消在操作队列中但尚未执行的操作。

 3、获取操作状态
 4、依赖关系管理
```-(void)addDependency:(NSOperation *)op```|```NSOperation```之间可以设置依赖来保证执行顺序，如一定要让操作A执行完后,才能执行操作B；直到所有依赖的操作都完成执行，该操作才被认为准备好执行。如果该操作已经在执行其任务，那么添加依赖关系没有实际效果。这个方法可以改变此操作的```isReady```和```dependencies```属性。不能创建循环依赖（不能A依赖于B，B又依赖于A），这样做可能导致操作之间的死锁。
```-(void)removeDependency:(NSOperation *)op```|移除对指定操作的依赖操作。这个方法可以改变此操作的```isReady```和```dependencies```属性。
 
 
 5、配置执行优先级
 6、等待操作对象
 ```-(void)waitUntilFinished```阻塞当前线程的执行，直到操作对象完成其任务；常用于将操作提交到队列后，调用此方法，等待该操作完成。
 注意：操作对象永远不能在自身上调用此方法，并且应该避免在提交给与自身相同的操作队列的任何操作上调用它，这样做会导致操作死锁。相反，应用程序的其他部分可以根据需要调用此方法，以防止其他任务在目标操作对象完成之前完成。对于位于不同操作队列中的操作调用此方法通常是安全的，尽管如果每个操作都在另一个操作队列上等待，仍然可以创建死锁。


7、操作死锁



 
 
 

 */
